/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package py.com.spadons.esmetil.controllers.jsf;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.LineChartSeries;
import py.com.spadons.esmetil.entities.Estacion;
import py.com.spadons.esmetil.entities.EstacionDetalle;
import py.com.spadons.esmetil.entities.views.DatoAnho;
import py.com.spadons.esmetil.entities.views.DatoDia;
import py.com.spadons.esmetil.entities.views.DatoMes;
import py.com.spadons.esmetil.utils.Anho;
import py.com.spadons.esmetil.utils.Mes;
import py.com.spadons.esmetil.utils.Util;

/**
 *
 * @author spadons
 */
@ManagedBean
@SessionScoped
public class GraficosController implements Serializable {

    @EJB
    private py.com.spadons.esmetil.sessionBeans.viewSessionBeans.DatoDiaFacade datoDiaFacade;
    @EJB
    private py.com.spadons.esmetil.sessionBeans.viewSessionBeans.DatoMesFacade datoMesFacade;
    @EJB
    private py.com.spadons.esmetil.sessionBeans.viewSessionBeans.DatoAnhoFacade datoAnhoFacade;
    private Estacion estacion1;
    private EstacionDetalle detalle1;
    private Integer periodo;
    private Date diaSeleccionado;
    private CartesianChartModel linearModel;
    private boolean graficado = false;
    private List<Anho> anhos;
    private List<Mes> meses;
    private Anho anhoSeleccionado;
    private Mes mesSeleccionado;

    public GraficosController() {
    }

    @PostConstruct
    public void Inicializar() {
        periodo = 1;
        anhos = Util.getAnhos();
        meses = Util.getMeses();
        anhoSeleccionado = Util.getAnhoActual();
        mesSeleccionado = Util.getMesActual();
        diaSeleccionado = Util.getDiaActual();
        graficar();
    }

    public CartesianChartModel getLinearModel() {
        return linearModel;
    }

    public void setLinearModel(CartesianChartModel linearModel) {
        this.linearModel = linearModel;
    }

    public boolean isGraficado() {
        return graficado;
    }

    public void setGraficado(boolean graficado) {
        this.graficado = graficado;
    }

    public Estacion getEstacion1() {
        return estacion1;
    }

    public void setEstacion1(Estacion estacion1) {
        this.estacion1 = estacion1;
    }

    public Integer getPeriodo() {
        return periodo;
    }

    public void setPeriodo(Integer periodo) {
        this.periodo = periodo;
    }

    public Date getDiaSeleccionado() {
        return diaSeleccionado;
    }

    public void setDiaSeleccionado(Date diaSeleccionado) {
        this.diaSeleccionado = diaSeleccionado;
    }

    public List<Anho> getAnhos() {
        return anhos;
    }

    public void setAnhos(List<Anho> anhos) {
        this.anhos = anhos;
    }

    public Anho getAnhoSeleccionado() {
        return anhoSeleccionado;
    }

    public void setAnhoSeleccionado(Anho anhoSeleccionado) {
        this.anhoSeleccionado = anhoSeleccionado;
    }

    public Mes getMesSeleccionado() {
        return mesSeleccionado;
    }

    public void setMesSeleccionado(Mes mesSeleccionado) {
        this.mesSeleccionado = mesSeleccionado;
    }

    public EstacionDetalle getDetalle1() {
        if (estacion1 != null) {
            if (!(estacion1.getEstacionDetalleList().contains(detalle1))) {
                detalle1 = null;
            }
        } else {
            detalle1 = null;
        }
        return detalle1;
    }

    public void setDetalle1(EstacionDetalle detalle1) {
        this.detalle1 = detalle1;
    }

    public List<Mes> getMeses() {
        return meses;
    }

    public void setMeses(List<Mes> meses) {
        this.meses = meses;
    }

    public void graficar() {

        if ((getDetalle1() != null && getPeriodo() != null && getDiaSeleccionado() != null)
                || (getDetalle1() != null && getPeriodo() != null && getMesSeleccionado() != null && getAnhoSeleccionado() != null)
                || (getDetalle1() != null && getPeriodo() != null && getMesSeleccionado() != null)) {

            if (periodo == 1 && getDiaSeleccionado() != null) {

                //Buscar Datos diarios
                List<DatoDia> ddList = datoDiaFacade.findByFechaEstacionDetalle(diaSeleccionado, detalle1);

                if (ddList.isEmpty()) {
                    crearGraficoVacio();
                    return;
                } else {
                    linearModel = new CartesianChartModel();

                    LineChartSeries minimo = new LineChartSeries();
                    minimo.setLabel("Mínimo");
                    LineChartSeries media = new LineChartSeries();
                    media.setLabel("Media");
                    LineChartSeries maximo = new LineChartSeries();
                    maximo.setLabel("Máximo");

                    for (DatoDia dd : ddList) {
                        minimo.set(dd.getHora(), dd.getMinimo());
                        media.set(dd.getHora(), dd.getMedia());
                        maximo.set(dd.getHora(), dd.getMaximo());
                    }

                    linearModel.addSeries(minimo);
                    linearModel.addSeries(media);
                    linearModel.addSeries(maximo);

                    return;
                }
            }

            if (periodo == 3 && getAnhoSeleccionado() != null && getMesSeleccionado() != null) {

                //Buscar Datos Mesuales
                List<DatoMes> dmList = datoMesFacade.findByMesAnho(getAnhoSeleccionado().toString(), String.format("%02d",getMesSeleccionado().getMesInt()),getDetalle1());

                if (dmList.isEmpty()) {
                    crearGraficoVacio();
                    return;
                } else {
                    linearModel = new CartesianChartModel();

                    LineChartSeries minimo = new LineChartSeries();
                    minimo.setLabel("Mínimo");
                    LineChartSeries media = new LineChartSeries();
                    media.setLabel("Media");
                    LineChartSeries maximo = new LineChartSeries();
                    maximo.setLabel("Máximo");

                    for (DatoMes dm : dmList) {
                        minimo.set(dm.getDia(), dm.getMinimo());
                        media.set(dm.getDia(), dm.getMedia());
                        maximo.set(dm.getDia(), dm.getMaximo());
                    }

                    linearModel.addSeries(minimo);
                    linearModel.addSeries(media);
                    linearModel.addSeries(maximo);
                    return;
                }
            }

            if (periodo == 4 && anhoSeleccionado != null) {

                //Buscar Datos Anuales
                List<DatoAnho> daList = datoAnhoFacade.findByAnho(getAnhoSeleccionado().toString(),getDetalle1());

                if (daList.isEmpty()) {
                    crearGraficoVacio();
                    return;
                } else {
                    linearModel = new CartesianChartModel();

                    LineChartSeries minimo = new LineChartSeries();
                    minimo.setLabel("Mínimo");
                    LineChartSeries media = new LineChartSeries();
                    media.setLabel("Media");
                    LineChartSeries maximo = new LineChartSeries();
                    maximo.setLabel("Máximo");

                    for (DatoAnho da : daList) {
                        minimo.set(da.getMes(), da.getMinimo());
                        media.set(da.getMes(), da.getMedia());
                        maximo.set(da.getMes(), da.getMaximo());
                    }

                    linearModel.addSeries(minimo);
                    linearModel.addSeries(media);
                    linearModel.addSeries(maximo);
                    return;
                }
            }
        }

        crearGraficoVacio();

    }

    public void crearGraficoVacio() {
        linearModel = new CartesianChartModel();

        LineChartSeries maximo = new LineChartSeries();
        maximo.setLabel("Máximo");
        LineChartSeries media = new LineChartSeries();
        media.setLabel("Media");
        LineChartSeries minimo = new LineChartSeries();
        minimo.setLabel("Mínimo");

        maximo.set(0, 0);
        media.set(0, 0);
        minimo.set(0, 0);

        /*
         for (int i = 0; i < 23; i++) {
         minimo.set(1, 0);
         }*/

        linearModel.addSeries(maximo);
        linearModel.addSeries(media);
        linearModel.addSeries(minimo);
    }
}
